﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;

namespace bin.imgshow
{
    public class ImageData
    {
        public byte[] data;
        public int width;
        public int height;
    }
    internal class ImgUnpack
    {
        public static void UnPack(ttbit.form.ImgData img, out ImageData color, out ImageData pal)
        {
            color = new ImageData();

            if (img.format == TTIMGFormat.PAL8 || img.format == TTIMGFormat.P5A3)
            {
                pal = new ImageData();
                pal.width = img.format == TTIMGFormat.PAL8 ? 256 : 32;
                pal.height = img.pals.Count;
                pal.data = new byte[pal.width * pal.height * 4];
                for (var y = 0; y < pal.height; y++)
                {
                    for (var x = 0; x < pal.width; x++)
                    {
                        pal.data[(y * pal.width + x) * 4 + 0] = img.pals[y].paldata[x * 4 + 0];
                        pal.data[(y * pal.width + x) * 4 + 1] = img.pals[y].paldata[x * 4 + 1];
                        pal.data[(y * pal.width + x) * 4 + 2] = img.pals[y].paldata[x * 4 + 2];
                        pal.data[(y * pal.width + x) * 4 + 3] = img.pals[y].paldata[x * 4 + 3];
                    }
                }
            }
            else
            {
                pal = null;

            }

            color.width = img.width;
            color.height = img.height;
            color.data = new byte[color.width * color.height * 4];
            if (img.format == TTIMGFormat.P5A3)
            {
                for (var y = 0; y < img.height; y++)
                {
                    for (var x = 0; x < img.width; x++)
                    {
                        var index = img.pixel[y * img.width + x] & 0x1F;
                        var alpha = img.pixel[y * img.width + x] & 0xE0;
                        color.data[(y * img.width + x) * 4 + 0] = pal.data[index * 4 + 0];
                        color.data[(y * img.width + x) * 4 + 1] = pal.data[index * 4 + 1];
                        color.data[(y * img.width + x) * 4 + 2] = pal.data[index * 4 + 2];
                        color.data[(y * img.width + x) * 4 + 3] = (byte)alpha;
                    }
                }
            }
            if (img.format == TTIMGFormat.PAL8)
            {
                for (var y = 0; y < img.height; y++)
                {
                    for (var x = 0; x < img.width; x++)
                    {
                        var index = img.pixel[y * img.width + x];
                        color.data[(y * img.width + x) * 4 + 0] = pal.data[index * 4 + 0];
                        color.data[(y * img.width + x) * 4 + 1] = pal.data[index * 4 + 1];
                        color.data[(y * img.width + x) * 4 + 2] = pal.data[index * 4 + 2];
                        color.data[(y * img.width + x) * 4 + 3] = pal.data[index * 4 + 3];
                    }
                }
            }
            if (img.format == TTIMGFormat.GRAY)
            {
                for (var y = 0; y < img.height; y++)
                {
                    for (var x = 0; x < img.width; x++)
                    {
                        var gray = img.pixel[y * img.width + x];
                        color.data[(y * img.width + x) * 4 + 0] = gray;
                        color.data[(y * img.width + x) * 4 + 1] = gray;
                        color.data[(y * img.width + x) * 4 + 2] = gray;
                        color.data[(y * img.width + x) * 4 + 3] = gray == 0 ? (byte)0 : (byte)1;
                    }
                }
            }
            if (img.format == TTIMGFormat.RGBA)
            {
                for (var y = 0; y < img.height; y++)
                {
                    for (var x = 0; x < img.width; x++)
                    {
                        var gray = img.pixel[y * img.width + x];
                        color.data[(y * img.width + x) * 4 + 0] = img.pixel[(y * img.width + x) * 4 + 0]; ;
                        color.data[(y * img.width + x) * 4 + 1] = img.pixel[(y * img.width + x) * 4 + 1]; ;
                        color.data[(y * img.width + x) * 4 + 2] = img.pixel[(y * img.width + x) * 4 + 2]; ;
                        color.data[(y * img.width + x) * 4 + 3] = img.pixel[(y * img.width + x) * 4 + 3]; ;
                    }
                }
            }
        }
    }
}
